package com.hzit.pay.center.service.impl;

import cn.hutool.core.text.csv.CsvData;
import cn.hutool.core.text.csv.CsvReadConfig;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvRow;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alipay.api.AlipayApiException;
import com.hzit.pay.center.service.IReconService;
import com.hzit.pay.center.utils.AlipayUtil;
import com.hzit.pay.center.vo.WechatReconData;
import com.pay.center.common.enums.PayChannelEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Service
public class ReconServiceImpl implements IReconService {

    @Autowired
    private AlipayUtil alipayUtil;

    @Override
    public void recon(String channel,String reconDate) {

        //检查对账是否成功


        //1.下载对账文件
        //1.查询对账文件路径表.
        if (PayChannelEnum.ALIPAY.getCode().equals(channel)){

            try {
                String filePath = alipayUtil.getReconFile(reconDate);
                //把路径写到数据中

            } catch (AlipayApiException e) {
                e.printStackTrace();
                //记录为对账失败
            }

            //2.解压文件，生成csv格式的对账文件

            //明细文件的路径
            String detailPath = "";


            //3.解析CSV: openCsv。 获取对账文件中的内容

            CsvReader csvReader = new CsvReader(new File(detailPath),new CsvReadConfig());

            CsvData csvData = csvReader.read();

            List<CsvRow> stringList = csvData.getRows();

            List<WechatReconData> studentList = new ArrayList<WechatReconData>(); //注意
            for (int i =0; i<stringList.size();i++){

                WechatReconData wechatReconData = new WechatReconData();

                CsvRow csvRow =  stringList.get(i);

                //支付宝交易号
                String tradeNo = csvRow.get(0);

                //商户交易号
                String outTradeNo = csvRow.get(1);

                String trapeType = csvRow.get(2);

                String orderAmt = csvRow.get(11);

                if(studentList.size() == 10000){
                    //执行插入

                    studentList.clear();

                }

                studentList.add(wechatReconData);

            }

            //批量入库


        }else if (PayChannelEnum.WECHAT_PAY.getCode().equals(channel)){

            //3.解析excel,  开源poi， 阿里巴巴 easyExcel

            String fileName = "";

            //
            List<WechatReconData> studentList = new ArrayList<WechatReconData>();

            EasyExcel.read(fileName, WechatReconData.class, new AnalysisEventListener<WechatReconData>() {

                // 每解析一条数据都会调用该方法
                @Override
                public void invoke(WechatReconData student, AnalysisContext analysisContext) {
//                System.out.println("解析一条Student对象：" + JSON.toJSONString(student));
                    studentList.add(student);
                }

                // 解析完毕的回调方法
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                    System.out.println("excel文件读取完毕！");
                }
            }).sheet().doRead();

        }
        //两个维度： 1.数据库中的流水去匹配对账文件的流水


        List<WechatReconData>  proList = new ArrayList<>();

        List<WechatReconData> serialList = new ArrayList<WechatReconData>();

        List<WechatReconData>  reconList = new ArrayList();

        for (int i=0;i<serialList.size();i++){

            String localTrano = serialList.get(i).getTradeNo();

            String localAmt = serialList.get(i).getOrderAmt();

            //根据 localTrano 去 对账表中查找

            WechatReconData wechatReconData = null; // 根据localTrano 查询

            if (ObjectUtils.isEmpty(wechatReconData)){
                //银行没有
                proList.add(null);

            }

            if (!localAmt.equals(wechatReconData.getOrderAmt())){
                //金额不匹配
                proList.add(null);

            }

        }


        //两个维度： 1.数据库中的流水去匹配对账文件的流水





        for (int i=0;i<reconList.size();i++){

            String localAmt = reconList.get(i).getOrderAmt();

            String localTrano = reconList.get(i).getTradeNo();


            //根据 localTrano 去 流水表中找

            WechatReconData wechatReconData = null; // 根据localTrano 查询

            if (ObjectUtils.isEmpty(wechatReconData)){
                //银行没有
                proList.add(null);

            }

            if (!localAmt.equals(wechatReconData.getOrderAmt())){
                //金额不匹配
                proList.add(null);

            }

        }
        //proList 问题数据，存入对账差异表





    }
}
